home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Developer CD v2.1
/
Amiga Developer CD v2.1.iso
/
CD32
/
CD32_Support
/
examples
/
cd2xspeed
/
CD2XSpeed.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-10-26
|
4KB
|
204 lines
Date; /*
SC LINK MODIFIED NOSTKCHK NOICONS CD2XSpeed
quit
*/
/*********************************
CD2XSpeed.c
Turn cd double read speed on/off.
W.D.L 930420
**********************************/
// 930916 Now goes away quietly upon failure, so its always safe to use.
/*
* COPYRIGHT: Unless otherwise noted, all files are Copyright (c) 1993-1999
* Amiga, Inc. All rights reserved.
*
* DISCLAIMER: This software is provided "as is". No representations or
* warranties are made with respect to the accuracy, reliability, performance,
* currentness, or operation of this software, and all use is at your own risk.
* Neither Amiga nor the authors assume any responsibility or liability
* whatsoever with respect to your use of this software.
*/
// Tab size is 8!
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/io.h>
#include <dos/dos.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/dos_protos.h>
#include <pragmas/exec_pragmas.h>
#include "devices/cd.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // for setmem()
#include "cd2xspeed_rev.h"
#define TEMPLATE "ON/S,OFF/S" VERSTAG " Wayne D. Lutz"
#define OPT_ON 0
#define OPT_OFF 1
#define OPT_COUNT 2
STATIC LONG opts[OPT_COUNT];
STATIC struct RDArgs * rdargs;
STATIC struct Device * CDDevice;
STATIC struct MsgPort * CDPort;
STATIC struct IOStdReq * CDDeviceMReq;
IMPORT struct Library * SysBase;
/*
* SendIOR -- asynchronously execute a device command
*/
BOOL
SendIOR( struct IOStdReq * req, LONG cmd, ULONG off, ULONG len, APTR data)
{
req->io_Command = cmd;
req->io_Offset = off;
req->io_Length = len;
req->io_Data = data;
SendIO( (struct IORequest *)req);
if ( req->io_Error ) {
// printf("SendIOR() ERROR!!! io_Error= %ld\n",req->io_Error);
return( FALSE );
} else {
return( TRUE );
}
} // SendIOR()
/*
* Send a CD_CONFIG command to cd.device.
*/
BOOL
CDConfig( ULONG tag, ... )
{
SendIOR( CDDeviceMReq, CD_CONFIG, NULL, 0, &tag );
if ( CDDeviceMReq->io_Error ) {
// printf("\n!!!CD_CONFIG ERROR!!! io_Error= %ld\n\n",CDDeviceMReq->io_Error);
return( FALSE );
}
WaitIO( (struct IORequest *)CDDeviceMReq );
return( TRUE );
} // CDConfig()
/*
* Close cd.device.
*/
VOID
CDDeviceTerm( VOID )
{
if ( CDDeviceMReq ) {
if ( CDDevice ) {
CloseDevice( (struct IORequest *)CDDeviceMReq );
CDDevice = NULL;
}
DeleteStdIO( CDDeviceMReq );
CDDeviceMReq = NULL;
}
if ( CDPort ) {
DeleteMsgPort( CDPort );
CDPort = NULL;
}
} // CDDeviceTerm()
/*
* Attempts to open cd.device if not already opened.
* Returns:
* retcode: (BOOL) reflects device's open state.
* *opened: (BOOL) TRUE if opened by this call.
*/
BOOL
CDDeviceInit( ULONG * opened )
{
if ( opened )
*opened = FALSE;
if ( !CDDevice ) {
if ( CDPort = CreateMsgPort() ) {
if ( CDDeviceMReq = CreateStdIO( CDPort ) ) {
if ( !OpenDevice( "cd.device", 0, (struct IORequest *)CDDeviceMReq, 0 ) ) {
CDDevice = CDDeviceMReq->io_Device;
}
}
}
if ( !CDDevice ) {
return( FALSE );
}
if ( opened )
*opened = TRUE;
}
return( TRUE );
} // CDDeviceInit()
VOID
main( LONG argc,char * argv[] )
{
int speed;
// workbench
if ( argc == 0 )
exit( RETURN_OK );
if ( SysBase->lib_Version < 36 )
exit( RETURN_OK );
setmem( opts, sizeof (opts) ,0 );
rdargs = ReadArgs(TEMPLATE, opts, NULL);
if ( !rdargs ) {
PrintFault(IoErr(), NULL);
exit( RETURN_OK );
}
if ( !CDDeviceInit( NULL ) ) {
// printf("Could NOT open cd.device Aborting\n");
exit( RETURN_OK );
}
speed = opts[OPT_OFF] ? 75 : 150;
CDConfig( TAGCD_READSPEED, speed, 0 );
CDDeviceTerm();
FreeArgs( rdargs );
exit( RETURN_OK );
} // main()